<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
<script>
    //单例模式  
    //一个构造函数可以通过new关键字来创造出 若干个实例 并且每一个实例都是不相同的地址 
    // 就是说 比较两个生成的实例时 比较的是存储的地址 因此每一个实例都有不同的存储空间 比较值为false 代码如下 
    function Person(){
         this.name = "小王八"
     }
     var p1 = new Person()
     var p2 = new Person()
     console.log(p1===p2)  //false  内存地址指向 


     //单例模式介绍 使用构造函数实例化的时候 不管实例多少回 都实例化出同一个对象
        //一个构造函数 一生只能new 出一个对象 
        //当我们使用构造函数 每一次new出来的对象 属性功能方法 完全一样 的时候 我们把它设计为单例模式 
    //构造函数
        //一个构造函数可以使用 new 关键字来创造出若干的实例。
        //每一个实例都可以使用这个构造函数的属性和方法。
    
        
//下面是 核心代码 
     //一个构造函数  
     function Person(){
         this.name = "jack"
     }   
     //全局变量 instance 
     var instance = null;
     function singleton(){
         if(instance === null){
             instance = new Person()
         }
         return instance
     }
       //这是singleton函数第一次调用，这时全局变量instance=null
		//因此，instance=new Person()
		//全局变量instance的值是Person构造函数的一个实例（将其命名为 实例 001）
		//p1 为 实例001
        var p1=new singleton()
		
		//这是singleton函数第二次调用，这时全局变量instance 为 实例001
		//instance的值不为空 ，因此直接返回 全局变量instance原来的值（实例001）
		//p2 为 实例001
        var p2=new singleton()
		
		//p1 p2   的值都为实例001 得到的都是同一个对象 因此值为true 
        console.log(p1===p2)//true
        //之后不管再实例化多少回，过程都与第二次调用singleton一致

        // 单例模式的简单应用场景
        // 网站的弹出层alert()或者右下角的广告页面
        // 一个网站不可能只弹出一次这个界面，不能每次弹出就创建一个
        // 每次弹出的都是之前创造好的，只是内容发生变化

</script>